/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.dao.impl;

import br.com.ecommerce.dao.CompraDAO;
import br.com.ecommerce.dao.pojo.Compra;
import br.com.ecommerce.dao.pojo.EntityPojo;
import br.com.ecommerce.exceptions.DatabaseException;
import br.com.ecommerce.exceptions.IdInvalidoException;
import br.com.ecommerce.exceptions.ObjetoInvalidoException;
import br.com.ecommerce.factory.DatabaseFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Classe que implementa os métodos que manipulam a entidade Compra
 * @author Afonso
 */
public class CompraDAOImpl implements CompraDAO {

    @Override
    public void create(EntityPojo obj) throws ObjetoInvalidoException,
                                                DatabaseException {
        if (obj == null || !(obj instanceof Compra)) {

           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo Compra");
        }

        Compra compra = (Compra)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sqlInsert;

        try {

            stmt = conn.createStatement();
            sqlInsert = "insert into COMPRA "
                    + " values (COMPRA_SEQ.nextval, '" + compra.getIdCliente() + "', "
                    + "'" + compra.getIdMeioPagamento() + "', "
                    + "'" + compra.getIdFrete() + "', "
                    + "'" + compra.getIdPromocao() + "', "
                    + "'" + compra.getDataCompra() + "', "
                    + "'" + compra.getValorTotal().toString().replace(".", ",") + "')";

            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.SEVERE, "SQL: " + sqlInsert);

            stmt.execute(sqlInsert);
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public EntityPojo readById(Integer idPrimaryKey)
                        throws IdInvalidoException, DatabaseException {
        if (idPrimaryKey == null) {
            throw new IdInvalidoException("ID Invalido ou nulo");
        }

        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        Compra result = null;
        try {
            sql = "SELECT * FROM COMPRA "
                    + "WHERE ID_COMPRA = " + idPrimaryKey ;

            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
                result = new Compra();
                result.setIdPrimaryKey(rs.getInt(1));
                result.setIdCliente(rs.getInt(2));
                result.setIdMeioPagamento(rs.getInt(3));
                result.setIdFrete(rs.getInt(4));
                result.setIdPromocao(rs.getInt(5));
                result.setDataCompra(rs.getString(6));
                result.setValorTotal(rs.getFloat(7));

            } else {
                 throw new DatabaseException("Não há dados na base de dados para"
                         + " a query: " + sql);

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return result;
    }

    @Override
    public List readAll() throws DatabaseException {
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        List<Compra> list = new ArrayList<Compra>();
        try {
            sql = "SELECT * FROM COMPRA "
                    + "ORDER BY ID_COMPRA";

            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                Compra result = new Compra();
                result.setIdPrimaryKey(rs.getInt(1));
                result.setIdCliente(rs.getInt(2));
                result.setIdMeioPagamento(rs.getInt(3));
                result.setIdFrete(rs.getInt(4));
                result.setIdPromocao(rs.getInt(5));
                result.setDataCompra(rs.getString(6));
                result.setValorTotal(rs.getFloat(7));

//                Logger.getLogger(ClienteDAOImpl.class.getName())
//                            .log(Level.INFO, "String SQL : " + cliente.toString());

                list.add(result);
            }


            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(CompraDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return list;
    }

    @Override
    public void deleteById(Integer idPrimaryKey) throws IdInvalidoException,
                                                    DatabaseException {

        throw new UnsupportedOperationException("As compras são imutáveis, "
                + "está tabela nunca terá seus registros deletados."
                + " por isso não há implementação");
    }

    @Override
    public void update(EntityPojo obj) throws ObjetoInvalidoException,
                                                    DatabaseException {
     throw new UnsupportedOperationException("As compras são imutáveis, cada"
             + "alteração é uma nova compra, por isso não há implementação");
    }

}
